package licode.unisop.auth.application.gateway;

import licode.unisop.auth.client.info.Credential;
import licode.unisop.client.info.SopTokenInfo;
import licode.unisop.client.info.SopUserIdIn;
import licode.unisop.client.vo.SopUserAssets;
import licode.unisop.provider.info.SiAuthCode;
import licode.unisop.provider.info.SiAuthContextIn;
import licode.unisop.provider.info.SiCodeInfo;

/**
 * 定义用户认证接口，负责生成令牌，存储认证信息以及获取认证信息
 *
 * @author WR
 */
public interface UserAuthGateway {
    /**
     * 对授权的用户进行续期处理
     * @param accessToken 访问令牌
     * @return 成功返回true；否则false
     */
    boolean renewAuthUser(String accessToken);

    Credential buildAuthInfo(SiAuthCode codeInfo);

    SiCodeInfo authorize(SiAuthContextIn contextIn);
    SiCodeInfo autoSso(SiAuthContextIn auth);
    
    /**
     * 创建认证信息
     *
     * @param contextIn 认证所需要的数据
     * @return 认证信息
     */
    Credential buildAuthInfo(SiAuthContextIn contextIn);

    /**
     * 刷新认证信息
     *
     * @param refreshToken 刷新token信息
     * @return 返回新的认证信息
     */
    Credential refreshAuthInfo(SopTokenInfo refreshToken);

    /**
     * 移除登录的认证信息
     * @param sopTokenInfo 访问令牌
     */
    void logout(SopTokenInfo sopTokenInfo);
    void logoutSso(SopTokenInfo sopTokenInfo);
    void logoutUser(SopUserIdIn req);
    void logoutSession(SopTokenInfo sopTokenInfo);
    void logoutByUserId(String userId);

    /**
     * 判断用户是否登录
     *
     * @param accessToken 访问令牌
     * @return 如果此令牌正常返回true；否则false
     */
    boolean userIsLogin(String accessToken);

    SopUserAssets getUserAssets(SopUserIdIn idInfo);
}
